--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Node / ReticulumProjects / MeshChatX.git / files / tests / backend / test_voicemail_manager_extended.py
Displaying Raw • Download
tests/backend/test_voicemail_manager_extended.py v4.5.0-rc.2 (1394a44a) Text, 5.88 KB
T8b949e# SPDX-License-Identifier: 0BSD
Tff7b72import T7ee787os
Tff7b72import T7ee787shutil
Tff7b72import T7ee787tempfile
Tff7b72from T7ee787unittestT7ee787.T7ee787mock Tff7b72import Te6edf3MagicMockTb4b4b4, Te6edf3patch
Tff7b72import T7ee787pytest
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787voicemail_manager Tff7b72import Te6edf3VoicemailManager
Tf0883e@pytestTff7b72.Td2a8fffixture
Tff7b72def Td2a8fftemp_dirTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3dir_path Tff7b72= Te6edf3tempfileTff7b72.Td2a8ffmkdtempTb4b4b4(Tb4b4b4)
Tff7b72yield Te6edf3dir_path
Te6edf3shutilTff7b72.Td2a8ffrmtreeTb4b4b4(Te6edf3dir_pathTb4b4b4)
Tf0883e@pytestTff7b72.Td2a8fffixture
Tff7b72def Td2a8ffmock_depsTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72with Tb4b4b4(
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.src.backend.voicemail_manager.shutil.whichTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3mock_whichTb4b4b4,
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.src.backend.voicemail_manager.subprocess.runTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3mock_runTb4b4b4,
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.src.backend.voicemail_manager.PipelineTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3mock_pipelineTb4b4b4,
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.src.backend.voicemail_manager.OpusFileSinkTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3mock_sinkTb4b4b4,
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.src.backend.voicemail_manager.OpusFileSourceTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3mock_sourceTb4b4b4,
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffRNS.logTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4:
Te6edf3mock_whichTff7b72.Td2a8ffside_effect Tff7b72= Tff7b72lambda Te6edf3xTb4b4b4: Ta5d6fffTa5d6ff"Ta5d6ff/usr/bin/Tffd700{Te6edf3xTffd700}Ta5d6ff"
Tff7b72yield Tb4b4b4{
Ta5d6ff"Ta5d6ffwhichTa5d6ff"Tb4b4b4: Te6edf3mock_whichTb4b4b4,
Ta5d6ff"Ta5d6ffrunTa5d6ff"Tb4b4b4: Te6edf3mock_runTb4b4b4,
Ta5d6ff"Ta5d6ffPipelineTa5d6ff"Tb4b4b4: Te6edf3mock_pipelineTb4b4b4,
Ta5d6ff"Ta5d6ffOpusFileSinkTa5d6ff"Tb4b4b4: Te6edf3mock_sinkTb4b4b4,
Ta5d6ff"Ta5d6ffOpusFileSourceTa5d6ff"Tb4b4b4: Te6edf3mock_sourceTb4b4b4,
Tb4b4b4}
Tff7b72def Td2a8fftest_voicemail_manager_initTb4b4b4(Te6edf3mock_depsTb4b4b4, Te6edf3temp_dirTb4b4b4)Tb4b4b4:
Te6edf3mock_db Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3mock_config Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3mock_tel Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3vm Tff7b72= Te6edf3VoicemailManagerTb4b4b4(Te6edf3mock_dbTb4b4b4, Te6edf3mock_configTb4b4b4, Te6edf3mock_telTb4b4b4, Te6edf3temp_dirTb4b4b4)
Tff7b72assert Te6edf3vmTff7b72.Td2a8ffstorage_dir Tff7b72== Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3temp_dirTb4b4b4, Ta5d6ff"Ta5d6ffvoicemailsTa5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3vmTff7b72.Td2a8ffhas_espeak Tff7b72is Tff7b72True
Tff7b72assert Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexistsTb4b4b4(Te6edf3vmTff7b72.Td2a8ffgreetings_dirTb4b4b4)
Tff7b72assert Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexistsTb4b4b4(Te6edf3vmTff7b72.Td2a8ffrecordings_dirTb4b4b4)
Tff7b72def Td2a8fftest_generate_greetingTb4b4b4(Te6edf3mock_depsTb4b4b4, Te6edf3temp_dirTb4b4b4)Tb4b4b4:
Te6edf3mock_db Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3mock_config Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3mock_tel Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
T8b949e# Setup config mocks
Te6edf3mock_configTff7b72.Td2a8ffvoicemail_tts_speedTff7b72.Td2a8ffgetTff7b72.Td2a8ffreturn_value Tff7b72= T79c0ff175
Te6edf3mock_configTff7b72.Td2a8ffvoicemail_tts_pitchTff7b72.Td2a8ffgetTff7b72.Td2a8ffreturn_value Tff7b72= T79c0ff50
Te6edf3mock_configTff7b72.Td2a8ffvoicemail_tts_voiceTff7b72.Td2a8ffgetTff7b72.Td2a8ffreturn_value Tff7b72= Ta5d6ff"Ta5d6ffenTa5d6ff"
Te6edf3mock_configTff7b72.Td2a8ffvoicemail_tts_word_gapTff7b72.Td2a8ffgetTff7b72.Td2a8ffreturn_value Tff7b72= T79c0ff10
Te6edf3vm Tff7b72= Te6edf3VoicemailManagerTb4b4b4(Te6edf3mock_dbTb4b4b4, Te6edf3mock_configTb4b4b4, Te6edf3mock_telTb4b4b4, Te6edf3temp_dirTb4b4b4)
Tff7b72with Tb4b4b4(
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffos.path.existsTa5d6ff"Tb4b4b4, Te6edf3return_valueTff7b72=Tff7b72TrueTb4b4b4)Tb4b4b4,
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffos.removeTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3patchTb4b4b4(
Ta5d6ff"Ta5d6ffmeshchatx.src.backend.voicemail_manager.audio_codec.encode_audio_to_ogg_opusTa5d6ff"Tb4b4b4,
Te6edf3return_valueTff7b72=Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3vmTff7b72.Td2a8ffgreetings_dirTb4b4b4, Ta5d6ff"Ta5d6ffgreeting.opusTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4) Tff7b72as Te6edf3mock_encodeTb4b4b4,
Tb4b4b4)Tb4b4b4:
Te6edf3vmTff7b72.Td2a8ffgenerate_greetingTb4b4b4(Ta5d6ff"Ta5d6ffHello worldTa5d6ff"Tb4b4b4)
T8b949e# espeak still runs as a subprocess; opus encoding is now in-process via audio_codec.
Tff7b72assert Te6edf3mock_depsTb4b4b4[Ta5d6ff"Ta5d6ffrunTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffcall_count Tff7b72== T79c0ff1
Te6edf3mock_encodeTff7b72.Td2a8ffassert_called_onceTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8fftest_start_recording_currently_disabledTb4b4b4(Te6edf3mock_depsTb4b4b4, Te6edf3temp_dirTb4b4b4)Tb4b4b4:
Te6edf3mock_db Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3mock_config Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3mock_tel_manager Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3mock_tel Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3mock_tel_managerTff7b72.Td2a8fftelephone Tff7b72= Te6edf3mock_tel
Te6edf3vm Tff7b72= Te6edf3VoicemailManagerTb4b4b4(Te6edf3mock_dbTb4b4b4, Te6edf3mock_configTb4b4b4, Te6edf3mock_tel_managerTb4b4b4, Te6edf3temp_dirTb4b4b4)
Te6edf3mock_caller_identity Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
T8b949e# Use actual bytes for hash, which has a .hex() method
Te6edf3mock_caller_identityTff7b72.Td2a8ffhash Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ffremote_hash_32_bytes_long_012345Ta5d6ff"
T8b949e# Recording requires telephone.active_call to exist
T8b949e# Without it, recording won't start
Te6edf3mock_telTff7b72.Td2a8ffactive_call Tff7b72= Tff7b72None
Te6edf3vmTff7b72.Td2a8ffstart_recordingTb4b4b4(Te6edf3mock_caller_identityTb4b4b4)
T8b949e# Without active_call, recording should not start
Tff7b72assert Te6edf3vmTff7b72.Td2a8ffis_recording Tff7b72is Tff7b72False
Tff7b72def Td2a8fftest_stop_recordingTb4b4b4(Te6edf3mock_depsTb4b4b4, Te6edf3temp_dirTb4b4b4)Tb4b4b4:
Te6edf3mock_db Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3mock_config Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3mock_tel Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3vm Tff7b72= Te6edf3VoicemailManagerTb4b4b4(Te6edf3mock_dbTb4b4b4, Te6edf3mock_configTb4b4b4, Te6edf3mock_telTb4b4b4, Te6edf3temp_dirTb4b4b4)
Te6edf3vmTff7b72.Td2a8ffis_recording Tff7b72= Tff7b72True
Te6edf3mock_pipeline_inst Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3vmTff7b72.Td2a8ffrecording_pipeline Tff7b72= Te6edf3mock_pipeline_inst
Te6edf3mock_sink Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3vmTff7b72.Td2a8ffrecording_sink Tff7b72= Te6edf3mock_sink
Te6edf3vmTff7b72.Td2a8ffrecording_filename Tff7b72= Ta5d6ff"Ta5d6fftest.opusTa5d6ff"
Te6edf3mock_remote_id Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
T8b949e# Use a mock for hash so we can mock its hex() method
Te6edf3mock_hash Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3mock_hashTff7b72.Td2a8ffhexTff7b72.Td2a8ffreturn_value Tff7b72= Ta5d6ff"Ta5d6ff72656d6f7465Ta5d6ff"
Te6edf3mock_remote_idTff7b72.Td2a8ffhash Tff7b72= Te6edf3mock_hash
Te6edf3vmTff7b72.Td2a8ffrecording_remote_identity Tff7b72= Te6edf3mock_remote_id
Te6edf3vmTff7b72.Td2a8ffrecording_start_time Tff7b72= T79c0ff100
Te6edf3vmTff7b72.Td2a8ffget_name_for_identity_hash Tff7b72= Te6edf3MagicMockTb4b4b4(Te6edf3return_valueTff7b72=Ta5d6ff"Ta5d6ffTest UserTa5d6ff"Tb4b4b4)
T8b949e# Create the recording file so add_voicemail gets called
Te6edf3recording_path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3vmTff7b72.Td2a8ffrecordings_dirTb4b4b4, Ta5d6ff"Ta5d6fftest.opusTa5d6ff"Tb4b4b4)
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Te6edf3vmTff7b72.Td2a8ffrecordings_dirTb4b4b4, Te6edf3exist_okTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72with Tffa657openTb4b4b4(Te6edf3recording_pathTb4b4b4, Ta5d6ff"Ta5d6ffwbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Te6edf3fTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ffbTa5d6ff"Ta5d6fffake opus dataTa5d6ff"Tb4b4b4)
Tff7b72with Tb4b4b4(
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6fftime.timeTa5d6ff"Tb4b4b4, Te6edf3return_valueTff7b72=T79c0ff110Tb4b4b4)Tb4b4b4,
Te6edf3patchTff7b72.Td2a8ffobjectTb4b4b4(Te6edf3vmTb4b4b4, Ta5d6ff"Ta5d6ff_fix_recordingTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4:
Te6edf3vmTff7b72.Td2a8ffstop_recordingTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3vmTff7b72.Td2a8ffis_recording Tff7b72is Tff7b72False
Te6edf3mock_pipeline_instTff7b72.Td2a8ffstopTff7b72.Td2a8ffassert_calledTb4b4b4(Tb4b4b4)
Te6edf3mock_sinkTff7b72.Td2a8ffstopTff7b72.Td2a8ffassert_calledTb4b4b4(Tb4b4b4)
Te6edf3mock_dbTff7b72.Td2a8ffvoicemailsTff7b72.Td2a8ffadd_voicemailTff7b72.Td2a8ffassert_calledTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8fftest_start_voicemail_sessionTb4b4b4(Te6edf3mock_depsTb4b4b4, Te6edf3temp_dirTb4b4b4)Tb4b4b4:
Te6edf3mock_db Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3mock_config Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3mock_tel_manager Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3mock_tel Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3mock_tel_managerTff7b72.Td2a8fftelephone Tff7b72= Te6edf3mock_tel
Te6edf3vm Tff7b72= Te6edf3VoicemailManagerTb4b4b4(Te6edf3mock_dbTb4b4b4, Te6edf3mock_configTb4b4b4, Te6edf3mock_tel_managerTb4b4b4, Te6edf3temp_dirTb4b4b4)
Te6edf3mock_caller Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3mock_callerTff7b72.Td2a8ffhash Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ffcallerTa5d6ff"
T8b949e# Set call_status to RINGING (4) so answer() gets called
Te6edf3mock_telTff7b72.Td2a8ffcall_status Tff7b72= T79c0ff4
Te6edf3mock_telTff7b72.Td2a8ffanswerTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72True
Te6edf3mock_telTff7b72.Td2a8ffaudio_input Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
T8b949e# Mocking threading.Thread to run the job synchronously for testing
Tff7b72with Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffthreading.ThreadTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3mock_threadTb4b4b4, Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6fftime.sleepTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3vmTff7b72.Td2a8ffstart_voicemail_sessionTb4b4b4(Te6edf3mock_callerTb4b4b4)
T8b949e# Verify answer was called
Te6edf3mock_telTff7b72.Td2a8ffanswerTff7b72.Td2a8ffassert_called_withTb4b4b4(Te6edf3mock_callerTb4b4b4)
T8b949e# Verify mic was stopped
Te6edf3mock_telTff7b72.Td2a8ffaudio_inputTff7b72.Td2a8ffstopTff7b72.Td2a8ffassert_calledTb4b4b4(Tb4b4b4)
T8b949e# Get the job function and run it
Te6edf3job_func Tff7b72= Te6edf3mock_threadTff7b72.Td2a8ffcall_argsTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6fftargetTa5d6ff"Tb4b4b4]
T8b949e# We need to setup more mocks for the job to run without crashing
Te6edf3mock_telTff7b72.Td2a8ffactive_call Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3mock_telTff7b72.Td2a8ffactive_callTff7b72.Td2a8ffaudio_source Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Tff7b72with Te6edf3patchTff7b72.Td2a8ffobjectTb4b4b4(Te6edf3vmTb4b4b4, Ta5d6ff"Ta5d6ffstart_recordingTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3mock_start_recTb4b4b4:
T8b949e# Run the job
Te6edf3job_funcTb4b4b4(Tb4b4b4)
Te6edf3mock_start_recTff7b72.Td2a8ffassert_calledTb4b4b4(Tb4b4b4)
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────